package com.cskaoyan.javase.oop2._1extends._10final._3variable._2member;

import com.cskaoyan.javase.oop2._1extends._5protected._2demo.test.StudentSon;

/**
 * final修饰成员变量表示该成员变量变成了一个常量，它在内存中的位置，生命周期，使用方式等都不会改变。
 * 语法:
 * [访问权限修饰符] final 数据类型 变量名;
 * 如果直接在类中成员位置，写上述语法定义成员"常量"，肯定会报错。
 * 这说明默认值不能作为常量的取值,成员常量没有默认初始化
 * 常量的取值只有一次固定,不可更改,所以它没有默认初始化
 *
 * 创建对象过程中,成员变量的赋值手段还有:
 *      1.显式赋值
 *      2.构造代码块赋值
 *      3,构造器赋值
 *
 * 常量只能赋值一次,所以以上赋值方式,必须选择其一,也只能选择其一.
 * 注意,使用构造器赋值,必须保证所有的构造器都能完成该成员常量的赋值,否者会报错!
 *
 * 思考:
 *      如果需要一个真正意义上的常量,比如G,PI这种
 *      使用成员常量可以吗?
 *      不可以,因为成员常量属于对象,完全可能由于创建对象而取到不同的值
 *      所以它不是一个真正意义上的常量
 *      而真正意义上的常量是final修饰的静态成员变量
 *      它全局唯一,且不可变
 *      也被称之为"全局常量"
 *
 * @since 11:43
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        Student s = new Student(100);
        System.out.println(s.age);
        System.out.println(s.name);
        // s.age = 28;

        Student s2 = new Student(200);
    }
}

class Student {
    // Variable 'age' might not have been initialized
    final int age = 18;
    final String name;
    final double score;

    {
        name = "张三";
    }

    public Student(double score) {
        this.score = score;
    }

    public Student() {
        score = 650;
    }
}